#ifndef _FACE_BOARD_H_
#define _FACE_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if (_SAFETY_MODULE_TYPE_ == _FACE_SAFETY_MODULE_) && (_SAFETY_VERIFYFUNCTION_ENABLE_)

// 最大特征值文件
#define FACE_MAX_OF_EIGENVALUE_FILE_SIZE               (NOMINAL_PACKET_LENGTH)
// 删除所有用户标志
#define FACE_DELETE_ALL_USER_IDENT                     (PROTOCOL_DUMMY_CODING)

/**
 * @brief 本地注册前的准备
 *
 * @param WaitDelay - 等待时间
 */
extern void FacePreparationsBeforeLocalRegister(uint8_t WaitDelay);

/**
 * @brief 将注册方向更新为正面
 *
 */
extern void FaceUpdateTheEnrollmentDirectionToFront(void);

/**
 * @brief 将注册方向更新为上方
 *
 */
extern void FaceUpdateRegistrationDirectionToUp(void);

/**
 * @brief 将注册方向更新为下方
 *
 */
extern void FaceUpdateRegistrationDirectionToDown(void);

/**
 * @brief 将注册方向更新为左边
 *
 */
extern void FaceUpdateRegistrationDirectionToLeft(void);

/**
 * @brief 将注册方向更新为右边
 *
 */
extern void FaceUpdateRegistrationDirectionToRight(void);

/**
 * @brief 获取设备激活状态
 *
 * @return bool - 激活状态（true：激活 false: 未激活）
 */
extern bool FacelGetDeviceActivationStatus(void);

/**
 * @brief 获取人脸检索超时时间
 *
 * @return uint8_t - 检索超时时间
 */
extern uint8_t FaceGetSearchTimeout(void);

/**
 * @brief 重置本地注册超时定时器
 *
 */
extern void FaceReloadLocalRegisterTimer(void);

/**
 * @brief 读取特征值文件属性
 *
 * @param pFileSizeOut - 特征值文件长度
 */
extern void FaceReadEigenvalueFileInformation(uint32_t *pFileSizeOut);

/**
 * @brief 写入特征值文件属性
 *
 * @param FileSize - 特征值文件长度
 * @return bool    - 获取状态（true：成功 false：失败）
 */
extern bool FaceWriteEigenvalueFileInformation(uint32_t FileSize);

/**
 * @brief 从内存中读取特征值文件
 *
 * @param ReadOffset - 读取偏移地址
 * @param pDataOut   - 目标偏移特征值文件
 * @param DateSize   - 获取文件大小
 */
extern void FaceReadFeatureValueFilesForMemory(uint32_t ReadOffset, uint8_t *pDataOut, uint16_t DateSize);

/**
 * @brief 将特征值文件写入到内存中
 *
 * @param WriteOffset - 写入偏移地址
 * @param pDataIn     - 待写入的特征值文件数据
 * @param DateSize    - 写入文件大小
 * @return bool       - 写入状态（true：成功 false：失败）
 */
extern bool FaceWriteFeatureValueFilesToMemory(uint32_t WriteOffset, uint8_t *pDataIn, uint16_t DateSize);

/**
 * @brief 删除重复的用户
 * 
 * @param UserId - 重复的用户
 * @return bool  - 删除状态（true：成功 false：失败）
 */
extern bool FaceDeleteDuplicateUsers(uint16_t UserId);

#endif
#endif
